flutter_webview WKWebview 百度循环加载问题

Flutter 3.24 后,flutter_webview 第一时间支持了 macOS 平台。在使用中,我发现 flutter_webview 在 macOS 下的 WKWebview,在打开百度时,WKWebview 会出现循环加载问题。当打开其它网站时,并无这一问题。

flutter_webview 是对各个平台下的 WebView 的一种统一封装,因此这个问题实际上是与 WKWebview。经过搜索,找到一摸一样的问题讨论《iPad iOS16+ Can't load "https://w… | Apple Developer Forums》。

链接中给出了 iOS 语境下的修复方式。于是问题变为,如何将这一修复,在 flutter_webview 这种 Flutter pub 依赖的语境下应用。


iOS/macOS 原生开发解决方案

涉及 API:

(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction preferences:(WKWebpagePreferences *)preferences decisionHandler:(void (^)(WKNavigationActionPolicy, WKWebpagePreferences *))decisionHandler{ [preferences setPreferredContentMode:WKContentModeMobile]; decisionHandler(WKNavigationActionPolicyAllow, preferences);

(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction preferences:(WKWebpagePreferences *)preferences decisionHandler:(void (^)(WKNavigationActionPolicy, WKWebpagePreferences *))decisionHandler{ [preferences setPreferredContentMode:WKContentModeMobile]; decisionHandler(WKNavigationActionPolicyAllow, preferences);

修复代码:

let webConfiguration = WKWebViewConfiguration()
if UIDevice.current.userInterfaceIdiom != .phone {
	let prefer = WKWebpagePreferences()
	prefer.preferredContentMode = .mobile
	webConfiguration.defaultWebpagePreferences = prefer
}

webView = WKWebView(frame: .zero, configuration: webConfiguration)
if UIDevice.current.userInterfaceIdiom != .phone {
	webView.customUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15"
}

Flutter 开发修复方案

解决方法很简单,设置一下 User-Agent 就可以了:

_controller = WebViewController()
  //...
  ..setUserAgent(
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15 Mobile',
  );

本文作者:Maeiee

本文链接:flutter_webview WKWebview 百度循环加载问题

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!